home *** CD-ROM | disk | FTP | other *** search
- /*
- * OIC structure definitions
- *
- * Copyright © John Wainwright 1988
- */
-
- #define IVs(obj,class,structure) ((structure *)(&((char *)(obj))[ClassOf(obj)->c_ivoffsets[class->c_index]]))
- #define myIVs(class,structure) ((structure *)(&((char *)(self))[ClassOf(self)->c_ivoffsets[class->c_index]]))
- #define localIVs(obj,structure) ((structure *)(&((char *)(obj))[ClassOf(obj)->c_ivoffsets[currentClass->c_index]]))
- #define CVs(obj,class,structure) ((structure *)(&((char *)((*obj)->c_classvars))[(*obj)->c_cvoffsets[class->c_index]]))
- #define myCVs(class,structure) ((structure *)(&((char *)((*self)->c_classvars))[(*self)->c_cvoffsets[class->c_index]]))
- #define localCVs(obj,structure) ((structure *)(&((char *)(*obj)->c_classvars)[(*self)->c_cvoffsets[currentClass->c_index]]))
-
- #define talloc(t) (t *)scalloc(sizeof(t))
- #define abs(x) (((x) < 0) ? (-(x)) : (x))
- #ifndef NULL
- #define NULL 0L
- #endif
- #define ClassOf(x) ((class)*(x))
-
- typedef struct class_struct *class;
- typedef struct class_struct **object;
- typedef struct classlist classlist; /* super class list */
- typedef struct GenericTable GenericTable; /* generic function method table */
- typedef GenericTable *generic; /* useful definition for generic */
- typedef struct MethTable MethTable; /* method table */
- typedef struct Method Method; /* method table function entry */
- typedef char * keyword_args; /* for the keyword argument system */
-
- struct classlist
- {
- classlist *cl_next; /* next class in list */
- class cl_class; /* -> class structure */
- };
-
- struct class_struct
- {
- class c_classtag; /* class class */
- class c_next; /* class list link */
- char *c_name; /* class name for debugging */
- int c_flags; /* flags */
- int c_lclivsize; /* local iv struct size */
- int c_lclcvsize; /* local cv struct size */
- int c_ivsize; /* total IVs size */
- int c_cvsize; /* total CVs size */
- int c_allocz; /* total object size */
- int c_index; /* class index into method/offset tables */
- int *c_ivoffsets; /* IV offset table */
- int *c_cvoffsets; /* CV offset table */
- char *c_classvars; /* class vars block (if any) */
- classlist *c_superclasses; /* superclass list */
- };
-
- #define C_HASCLASSMETHODS 1 /* class methods defined. c_flags fields... */
-
- extern char *salloc();
- extern char *scalloc();
- extern char *srealloc();
-
- extern class NewClass();
- extern class currentClass;
- extern GenericTable* currentGeneric;
- extern class classes;
- extern object namedObjects;
- extern GenericTable *generics;
- extern object New();
- extern object Dispatch();
- extern object ClassDispatch();
- extern object ApplyGeneric();
- extern object Super();
- extern object SuperFrom();
- extern object SuperPassArgs();
- extern int SizeOf();
- extern char *ClassNameOf();
- extern char *GenericName();
- extern int IsAKindOf();
- extern int IsA();
- extern int IsObj();
- extern object key_arg();
-
- #define CLASS 1 /* index of class method table */
- #define END 0L
- #define UNLINKED (GenericTable *)1L /* initial value for generic table links */
- #define method static /* syntactic sugar for method declarations */
-
- struct Method /* method function table entry */
- {
- object (*mf_func)(); /* method function */
- class mf_from; /* class from which inherited */
- };
-
- struct MethTable
- {
- int mth_minClass; /* lowest class index */
- int mth_maxClass; /* highest class index */
- Method *mth_meths; /* table of method functions */
- };
-
- struct GenericTable
- {
- GenericTable *gen_next; /* linked list of generics */
- object (*gen_generic)(); /* pointer to my generic */
- char *gen_name; /* generic function name */
- MethTable gen_mtables[2]; /* method tables inst. & class */
- };
-
- #define defGeneric(gen, genTable, name) \
- GenericTable genTable[1] = \
- { \
- UNLINKED, &gen, name \
- }; \
- object \
- gen(obj, args) \
- object obj; \
- char *args; \
- { \
- return \
- (ClassOf(obj) == Class) ? \
- ClassDispatch(&genTable, obj, &args) \
- : \
- Dispatch(&genTable, obj, &args); \
- }
-
- #define externGeneric(gen, genTable) \
- extern GenericTable genTable[1]; \
- extern object gen();